#pragma once
#include <functional>
#include <mutex>
#include <thread>
#include <unordered_map>
#include <vector>

class EventHandler;

/// 单线程事件循环 (Reactor)
class EventLoop {
public:
    EventLoop();
    ~EventLoop();

    void loop();          // 进入事件循环（必须在所属线程调用）
    void quit();          // 安全退出事件循环

    void addHandler(int fd, uint32_t events, EventHandler* handler);
    void updateHandler(int fd, uint32_t events);
    void removeHandler(int fd);

    /// 跨线程投递任务；若在本线程则直接执行
    void runInLoop(std::function<void()> cb);

    bool isInLoopThread() const { return std::this_thread::get_id() == threadId_; }

private:
    void wakeup();              // 唤醒 epoll_wait
    void handleWakeup();        // 处理 eventfd 事件
    void doPendingFunctors();   // 执行待处理任务队列

    int epfd_;
    int wakeupFd_;
    std::unordered_map<int, EventHandler*> handlers_;
    std::mutex mutex_;
    std::vector<std::function<void()>> pendingFunctors_;
    bool quitting_{false};
    std::thread::id threadId_;
};